package com.jerry.basic.exception;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class ExceptionInfo {

	/**
	 * @param args
	 * 世界上最真情的相依，是你在try我在catch。无论你发神马脾气，我都默默承受，静静处理。
	 */
	/*
	 * java的异常体系：
	 * Throwable 类是 Java 语言中所有错误或异常的超类（这就是一切皆可抛的东西）。
	 * 它有两个子类：Error和Exception。
	 * 
	 * Error：用于指示合理的应用程序不应该试图捕获的严重问题。这种情况是很大的问题，大到
	 * 你不能处理了，所以听之任之就行了，你不用管它。比如说VirtualMachineError：当 Java 
	 * 虚拟机崩溃或用尽了它继续操作所需的资源时，抛出该错误。好吧，就算这个异常存在了，
	 * 那么应该何时，如何处理它呢？？交给JVM吧，没有比它更专业的了。
	 * 
	 * Java编译器要求程序必须捕获或声明所有的非运行时异常，但对运行时异常可以不做处理。
	 * 其中类RuntimeException代表运行时由Java虚拟机生成的异常
	 * 
	 * 产生异常的原因，比如：
     * 试图打开的文件不存在，网络连接中断，操作符越界，要加载的类找不到等。
     * NullPointerException: 当对象没有实例化时，就试图通过该对象的变量访问其数据或方法.
     * 
     * RuntimeException意味着程序设计或实现问题，如：数组使用越界，算术运算异常，空指针异常
     * 即访问没有初始化的空指针等。正确设计与实现的程序不应产生这些异常。对于这些异常，处理
     * 的策略是纠正错误。
     * 
     * 常见的RuntimeExcepiton有IllegalArgumentException、IllegalStateException、
     * NullPointerException、IndexOutOfBoundsException等等
     * 
     * 其他异常，通常是由环境因素引起的，例如文件不存在，无效URL等。这类异常经常是由用户的误
     * 操作引起的，可以在异常处理中处理，例如提示用户进行正确操作等。
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		printFile("C:/file");
	}
	
	public static void readFile(String file) throws FileNotFoundException {
        try {
            @SuppressWarnings("unused")
			BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            System.err.println("不知道如何处理该异常或者根本不想处理它,但是不做处理又不合适," +
            		           "这是重新抛出异常交给上一级处理");
            //重新抛出异常
            throw e;
        }
    }
     
    public static void printFile(String file){
        try {
            readFile(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

}
